16452
23054
Möchten Sie diesen Beitrag verbessern? Geben Sie detaillierte Antworten auf diese Frage, einschließlich Zitaten und einer Erklärung, warum Ihre Antwort richtig ist. Antworten ohne ausreichende Details können bearbeitet oder gelöscht werden.
Ich habe Git fälschlicherweise Dateien mit dem folgenden Befehl hinzugefügt:
git add myfile.txt
Ich habe git commit noch nicht ausgeführt. Gibt es eine Möglichkeit, dies rückgängig zu machen, damit diese Dateien nicht in das Commit aufgenommen werden? 
1
2
Nächster
Sie können git add vor dem Festschreiben mit rückgängig machen
git reset 
Dadurch wird es aus dem aktuellen Index (der Liste "In Kürze festgeschrieben") entfernt, ohne dass etwas anderes geändert wird.
Sie können verwenden
Git zurücksetzen
ohne Dateinamen, um alle fälligen Änderungen aufzuheben. Dies kann nützlich sein, wenn zu viele Dateien vorhanden sind, um in angemessener Zeit einzeln aufgelistet zu werden.
In alten Versionen von Git entsprechen die obigen Befehle dem Zurücksetzen von HEAD  und dem Zurücksetzen von HEAD. Sie schlagen fehl, wenn HEAD undefiniert (weil Sie noch keine Commits in Ihrem Repository vorgenommen haben) oder mehrdeutig (weil Sie) sind hat einen Zweig namens HEAD erstellt, was eine dumme Sache ist, die Sie nicht tun sollten). Dies wurde jedoch in Git 1.8.2 geändert, sodass Sie in modernen Versionen von Git die obigen Befehle bereits vor dem ersten Festschreiben verwenden können:
"git reset" (ohne Optionen oder Parameter) wird verwendet, um Fehler zu machen, wenn
Sie haben keine Verpflichtungen in Ihrer Geschichte, aber es gibt Ihnen jetzt
ein leerer Index (um nicht existierenden Commits zu entsprechen, auf denen Sie nicht einmal sind).
Dokumentation: Git Reset
|
Sie wollen:
git rm --cached 
Argumentation:
Als ich neu darin war, habe ich es zuerst versucht
Git zurücksetzen.
(um mein gesamtes anfängliches Hinzufügen rückgängig zu machen), nur um diese (nicht so) hilfreiche Nachricht zu erhalten:
fatal: Fehler beim Auflösen von 'HEAD' als gültige Referenz.
Es stellt sich heraus, dass dies daran liegt, dass der HEAD-Verweis (Zweig?) Erst nach dem ersten Festschreiben vorhanden ist. Das heißt, Sie werden auf das gleiche Anfängerproblem wie ich stoßen, wenn Ihr Workflow wie meiner so etwas wie:
CD in mein tolles neues Projektverzeichnis, um Git, die neue Hotness, auszuprobieren
git init
git hinzufügen.
Git-Status
... viele Mistrollen von ...
=> Verdammt, ich wollte das alles nicht hinzufügen.
google "git add rückgängig machen"
=> Stapelüberlauf finden - yay
Git zurücksetzen.
=> fatal: Fehler beim Auflösen von 'HEAD' als gültige Referenz.
Es stellt sich ferner heraus, dass in der Mailingliste ein Fehler protokolliert wurde, der gegen die Nicht-Nützlichkeit dieses Fehlers protokolliert wurde.
Und dass die richtige Lösung genau dort in der Git-Statusausgabe war (was ich ja als 'Mist' beschönigt habe)
...
# Zu verpflichtende Änderungen:
# (benutze "git rm --cached  ...", um die Bühne zu verlassen)
...
Und die Lösung besteht in der Tat darin, git rm - cached FILE zu verwenden.
Beachten Sie die Warnungen an anderer Stelle hier - git rm löscht Ihre lokale Arbeitskopie der Datei, jedoch nicht, wenn Sie --cached verwenden. Hier ist das Ergebnis von git help rm:
- zwischengespeichert
Verwenden Sie diese Option, um nur Pfade zu entfernen und aus dem Index zu entfernen.
Arbeitsbaumdateien, ob geändert oder nicht, bleiben erhalten.
Ich fahre fort zu benutzen
git rm - zwischengespeichert.
alles entfernen und neu starten. Hat aber nicht funktioniert, weil beim Hinzufügen. ist rekursiv, stellt sich heraus, dass rm -r rekursiv benötigt. Seufzer.
git rm -r --cached.
Okay, jetzt bin ich wieder da, wo ich angefangen habe. Das nächste Mal werde ich -n verwenden, um einen Trockenlauf durchzuführen und zu sehen, was hinzugefügt wird:
git add -n.
Ich habe alles an einen sicheren Ort gezippt, bevor ich auf die Hilfe von git vertraute, dass das --cached nichts zerstört (und was ist, wenn ich es falsch geschrieben habe).
|
Wenn Sie Folgendes eingeben:
Git-Status
Git wird Ihnen sagen, was inszeniert wird usw., einschließlich Anweisungen zum Aufheben der Bühne:
Verwenden Sie "git reset HEAD  ...", um die Bühne zu verlassen
Ich finde, Git hat mich ziemlich gut dazu gebracht, in solchen Situationen das Richtige zu tun.
Hinweis: Neuere Git-Versionen (1.8.4.x) haben diese Meldung geändert:
(benutze "git rm --cached  ...", um die Bühne zu verlassen)
|
Zur Verdeutlichung: git add verschiebt Änderungen vom aktuellen Arbeitsverzeichnis in den Staging-Bereich (Index).
Dieser Vorgang wird als Staging bezeichnet. Der natürlichste Befehl zum Bereitstellen der Änderungen (geänderte Dateien) ist also der offensichtliche:
Git Bühne
git add ist nur ein einfacher zu tippender Alias ​​für git stage
Schade, dass es weder git unstage noch git unadd Befehle gibt. Das relevante ist schwerer zu erraten oder zu merken, aber es ist ziemlich offensichtlich:
git reset HEAD -
Wir können dafür leicht einen Alias ​​erstellen:
git config --global alias.unadd 'HEAD zurücksetzen -'
git config --global alias.unstage 'HEAD zurücksetzen -'
Und schließlich haben wir neue Befehle:
git add file1
Git Stage File2
git unadd file2
git unstage file1
Persönlich verwende ich noch kürzere Aliase:
git a # Für die Inszenierung
git u # Zum Aufheben der Inszenierung
|
Eine Ergänzung zu der akzeptierten Antwort: Wenn Ihre versehentlich hinzugefügte Datei sehr groß war, werden Sie wahrscheinlich feststellen, dass sie auch nach dem Entfernen aus dem Index mit 'git reset' noch Speicherplatz im .git-Verzeichnis belegt.
Dies ist kein Grund zur Sorge; Die Datei befindet sich zwar noch im Repository, aber nur als "loses Objekt". Es wird nicht in andere Repositorys kopiert (per Klon, Push), und der Speicherplatz wird schließlich zurückgefordert - wenn auch möglicherweise nicht sehr bald. Wenn Sie Angst haben, können Sie laufen:
git gc --prune = jetzt
Update (was folgt, ist mein Versuch, einige Verwirrungen zu beseitigen, die sich aus den am besten bewerteten Antworten ergeben können):
Also, was ist das wahre Rückgängigmachen von Git Add?
git reset HEAD ?
oder
git rm --cached ?
Genau genommen, und wenn ich mich nicht irre: keine.
git add kann nicht rückgängig gemacht werden - im Allgemeinen sicher.
Erinnern wir uns zuerst daran, was git add  tatsächlich tut:
Wenn  zuvor nicht verfolgt wurde, fügt git add es hinzuder Cache mit seinem aktuellen Inhalt.
Wenn  bereits verfolgt wurde, speichert git add den aktuellen Inhalt (Snapshot, Version) im Cache. In Git wird diese Aktion immer noch als Hinzufügen bezeichnet (nicht nur als Aktualisierung), da zwei verschiedene Versionen (Snapshots) einer Datei als zwei verschiedene Elemente betrachtet werden. Daher fügen wir dem Cache tatsächlich ein neues Element hinzu, um eventuell zu sein später begangen.
Vor diesem Hintergrund ist die Frage etwas mehrdeutig:
Ich habe fälschlicherweise Dateien mit dem Befehl hinzugefügt ...
Das OP-Szenario scheint das erste zu sein (nicht verfolgte Datei). Wir möchten, dass durch "Rückgängig" die Datei (nicht nur der aktuelle Inhalt) aus den verfolgten Elementen entfernt wird. Wenn dies der Fall ist, ist es in Ordnung, git rm --cached  auszuführen.
Und wir könnten auch git reset HEAD  ausführen. Dies ist im Allgemeinen vorzuziehen, da es in beiden Szenarien funktioniert: Es wird auch rückgängig gemacht, wenn wir fälschlicherweise eine Version eines bereits verfolgten Elements hinzugefügt haben.
Es gibt jedoch zwei Einschränkungen.
Erstens: Es gibt (wie in der Antwort ausgeführt) nur ein Szenario, in dem git reset HEAD nicht funktioniert, git rm --cached jedoch: ein neues Repository (keine Commits). Aber das ist wirklich ein praktisch irrelevanter Fall.
Zweitens: Beachten Sie, dass git reset HEAD den zuvor zwischengespeicherten Dateiinhalt nicht auf magische Weise wiederherstellen kann, sondern ihn lediglich vom HEAD neu synchronisiert. Wenn unser fehlgeleitetes Git-Add eine zuvor bereitgestellte, nicht festgeschriebene Version überschrieben hat, können wir sie nicht wiederherstellen. Genau deshalb können wir [*] nicht rückgängig machen.
Beispiel:
$ git init
$ echo "version 1"> file.txt
$ git add file.txt # Erstes Hinzufügen von file.txt
$ git commit -m 'erstes Commit'
$ echo "version 2"> file.txt
$ git add file.txt # Stage (nicht festschreiben) "Version 2" von file.txt
$ git diff --cached file.txt
-Version 1
+ Version 2
$ echo "version 3"> file.txt
$ git diff file.txt
-Version 2
+ Version 3
$ git add file.txt # Hoppla, das haben wir nicht gemeint
$ git reset HEAD file.txt # Rückgängig machen?
$ git diff --cached file.txt # Natürlich kein Unterschied. Bühne == KOPF
$ git diff file.txt # Wir haben "Version 2" unwiderruflich verloren.
-Version 1
+ Version 3
Dies ist natürlich nicht sehr kritisch, wenn wir nur dem üblichen verzögerten Workflow folgen, bei dem 'git add' nur zum Hinzufügen neuer Dateien ausgeführt wird (Fall 1), und neue Inhalte über den Befehl commit, git commit -a aktualisieren.
* (Bearbeiten: Das oben Gesagte ist praktisch korrekt, aber es kann dennoch einige leicht hackige / verschlungene Möglichkeiten geben, Änderungen wiederherzustellen, die inszeniert, aber nicht festgeschrieben und dann überschrieben wurden - siehe die Kommentare von Johannes Matokic und iolsmit).
|
Das Rückgängigmachen einer bereits hinzugefügten Datei ist mit Git ganz einfach. Verwenden Sie zum Zurücksetzen von myfile.txt, die bereits hinzugefügt wurden, Folgendes:
git reset HEAD myfile.txt
Erläuterung:
Nachdem Sie unerwünschte Dateien bereitgestellt haben, können Sie zum Rückgängigmachen den Git-Reset durchführen. Kopf ist Kopf Ihrer Datei in der lokalen und der letzte Parameter ist der Name Ihrer Datei.
Ich habe die Schritte im Bild unten detaillierter für Sie erstellt, einschließlich aller Schritte, die in diesen Fällen auftreten können:
|
git rm - zwischengespeichert. -r
wird alles, was Sie aus Ihrem aktuellen Verzeichnis hinzugefügt haben, rekursiv "entfernen"
|
Lauf
Git Gui
und entfernen Sie alle Dateien manuell oder indem Sie alle auswählen und auf die Schaltfläche Unstage from Commit klicken.
|
Die Frage ist nicht klar gestellt. Der Grund ist, dass git add zwei Bedeutungen hat:
Hinzufügen einer neuen Datei zum Staging-Bereich und rückgängig machen mit git rm --cached file.
Hinzufügen einer geänderten Datei zum Staging-Bereich und Rückgängigmachen mit der HEAD-Datei zum Zurücksetzen des Git.
Im Zweifelsfall verwenden
git HEAD-Datei zurücksetzen
Weil es in beiden Fällen das Erwartete tut.
Warnung: Wenn Sie eine git rm - zwischengespeicherte Datei für eine geänderte Datei (eine Datei, die zuvor im Repository vorhanden war) ausführen, wird die Datei bei git commit entfernt! Es ist weiterhin in Ihrem Dateisystem vorhanden, aber wenn jemand anderes Ihr Commit abruft, wird die Datei aus seinem Arbeitsbaum gelöscht.
Der Git-Status zeigt an, ob die Datei eine neue Datei war oder geändert wurde:
Auf Zweigstamm
Zu verpflichtende Änderungen:
(benutze "git reset HEAD  ...", um die Bühne zu verlassen)
neue Datei: my_new_file.txt
geändert: my_modified_file.txt
|
Git hat Befehle für jede erdenkliche Aktion, aber es benötigt umfangreiches Wissen, um die Dinge richtig zu machen, und aus diesem Grund ist es bestenfalls kontraintuitiv ...
Was du vorher gemacht hast:
Eine Datei wurde geändert und git add. Oder git add  verwendet.
Was du willst:
Entfernen Sie die Datei aus dem Index, behalten Sie sie jedoch versioniert bei und lassen Sie nicht festgeschriebene Änderungen in der Arbeitskopie übrig:
git reset HEAD 
Setzen Sie die Datei von HEAD auf den letzten Status zurück, machen Sie Änderungen rückgängig und entfernen Sie sie aus dem Index:
# Denken Sie an `svn revert ` IIRC.
git reset HEAD 
Git Checkout 
# Wenn Sie eine `` mit dem Namen `` haben, verwenden Sie:
Git Checkout - 
Dies ist erforderlich, da git reset --hard HEAD nicht mit einzelnen Dateien funktioniert.
Entfernen Sie  aus dem Index und der Versionierung, und behalten Sie die nicht versionierte Datei mit den Änderungen in der Arbeitskopie bei:
git rm --cached 
Entfernen Sie  vollständig aus der Arbeitskopie und Versionierung:
git rm 
|
Wenn Sie sich auf Ihrem ersten Commit befinden und git nicht verwenden könnenzurücksetzen, einfach "Git bankrott" deklarieren und den .git-Ordner löschen und von vorne beginnen
|
Wie bei vielen anderen Antworten können Sie git reset verwenden
ABER:
Ich habe diesen tollen kleinen Beitrag gefunden, der tatsächlich den Git-Befehl (naja, einen Alias) für git unadd hinzufügt: siehe git unadd für Details oder ..
Einfach,
git config --global alias.unadd "HEAD zurücksetzen"
Jetzt kannst du
git unadd foo.txt bar.txt
|
Verwenden Sie git add -i, um gerade hinzugefügte Dateien aus Ihrem bevorstehenden Commit zu entfernen. Beispiel:
Hinzufügen der Datei, die Sie nicht wollten:
$ git add foo
$ git status
# Auf Zweigstellenmaster
# Zu verpflichtende Änderungen:
# (benutze "git reset HEAD  ...", um die Bühne zu verlassen)
#
# neue Datei: foo
#
# Nicht verfolgte Dateien:
# (Verwenden Sie "git add  ...", um in das Festschreiben aufzunehmen)
# [...] #
Gehen Sie zum interaktiven Hinzufügen, um Ihr Hinzufügen rückgängig zu machen (die hier bei git eingegebenen Befehle sind "r" (Zurücksetzen), "1" (erster Eintrag in der Liste "Zurücksetzen zeigt"), "Zurück", um den Wiederherstellungsmodus zu verlassen, und "q" (Verlassen):
$ git add -i
inszenierter nicht inszenierter Pfad
1: + 1 / -0 nichts foo
*** Befehle ***
1: [s] tatus 2: [u] pdate 3: [r] evert 4: [a] dd untracked
5: [p] atch 6: [d] iff 7: [q] uit 8: [h] elp
Was jetzt> r
inszenierter nicht inszenierter Pfad
1: + 1 / -0 nichts [f] oo
Zurücksetzen >> 1
inszenierter nicht inszenierter Pfad
* 1: + 1 / -0 nichts [f] oo
Zurücksetzen >>
Hinweis: foo ist jetzt nicht mehr verfolgt.
einen Pfad zurückgesetzt
*** Befehle ***
1: [s] tatus 2: [u] pdate 3: [r] evert 4: [a] dd untracked
5: [p] atch 6: [d] iff 7: [q] uit 8: [h] elp
Was jetzt> q
Tschüss.
$
Das ist es! Hier ist Ihr Beweis, der zeigt, dass "foo" wieder auf der nicht verfolgten Liste steht:
$ git status
# Auf Zweigstellenmaster
# Nicht verfolgte Dateien:
# (Verwenden Sie "git add  ...", um in das Festschreiben aufzunehmen)
# [...]
# foo
Es wurde nichts zum Festschreiben hinzugefügt, aber nicht verfolgte Dateien sind vorhanden (verwenden Sie "git add" zum Verfolgen).
$
|
Hierfür kann git remove oder git rm mit dem Flag --cached verwendet werden. Versuchen:
git help rm
|
So vermeiden Sie dieses ärgerliche Problem, wenn Sie ein neues Projekt starten:
Erstellen Sie das Hauptverzeichnis für Ihr neues Projekt.
Führen Sie git init aus.
Erstellen Sie nun eine Gitignore-Datei (auch wenn diese leer ist).
Übernehmen Sie Ihre .gitignore-Datei.
Git macht es wirklich schwierig, Git zurückzusetzen, wenn Sie keine Commits haben. Wenn Sie ein winziges anfängliches Commit erstellen, nur um eines zu haben, können Sie danach git add -A und git so oft zurücksetzen, wie Sie möchten, um alles richtig zu machen.
Ein weiterer Vorteil dieser Methode besteht darin, dass es einfach ist, wenn Sie später auf Probleme mit dem Zeilenende stoßen und alle Ihre Dateien aktualisieren müssen:
Überprüfen Sie das anfängliche Commit. Dadurch werden alle Ihre Dateien entfernt.
Überprüfen Sie dann erneut Ihr letztes Commit. Dadurch werden neue Kopien Ihrer Dateien unter Verwendung Ihrer aktuellen Einstellungen für das Zeilenende abgerufen.
|
Vielleicht hat sich Git weiterentwickelt, seit Sie Ihre Frage gestellt haben.
$> git --version
Git Version 1.6.2.1
Jetzt können Sie versuchen:
Git Reset HEAD.
Dies sollte das sein, wonach Sie suchen.
|
Beachten Sie, dass Sie ein Trennzeichen einfügen müssen, wenn Sie keine Revision angeben. Beispiel von meiner Konsole:
git reset 
fatal: mehrdeutiges Argument '': unbekannte Revision oder Pfad nicht im Arbeitsbaum.
Verwenden Sie '-', um Pfade von Revisionen zu trennen
Git Reset - 
Nicht bereitgestellte Änderungen nach dem Zurücksetzen:
M 
(Git Version 1.7.5.4)
|
So entfernen Sie neue Dateien aus dem Staging-Bereich (und nur im Falle einer neuen Datei), wie oben vorgeschlagen:
git rm - zwischengespeicherte DATEI
Verwenden Sie rm --cached nur für neue Dateien, die versehentlich hinzugefügt wurden.
|
Mit dem folgenden Befehl können Sie jede Datei in einem bestimmten Ordner (und seinen Unterordnern) zurücksetzen:
Git Reset *
|
Verwenden Sie den Befehl *, um mehrere Dateien gleichzeitig zu verarbeiten:
git reset HEAD * .prj
git reset HEAD * .bmp
git reset HEAD * gdb *
etc.
|
Geben Sie einfach git reset ein, es wird zurückgesetzt und es ist, als hätten Sie git add nie eingegeben. seit deinem letzten Commit. Stellen Sie sicher, dass Sie sich zuvor verpflichtet haben.
|
Angenommen, ich erstelle eine neue Datei, newFile.txt:
Angenommen, ich füge die Datei versehentlich hinzu, git add newFile.txt:
Jetzt möchte ich dieses Hinzufügen rückgängig machen, bevor ich festschreibe, git reset newFile.txt:
|
Für eine bestimmte Datei:
git reset my_file.txt
git checkout my_file.txt
Für alle hinzugefügten Dateien:
Git zurücksetzen.
Git Checkout.
Hinweis: Beim Auschecken wird der Code in den Dateien geändert und in den zuletzt aktualisierten (festgeschriebenen) Status versetzt. Durch das Zurücksetzen werden die Codes nicht geändert. es setzt nur den Header zurück.
|
Verwenden Sie zum Rückgängigmachen von git add:
git reset Dateiname
|
Mit diesem Befehl werden Ihre Änderungen aufgehoben:
git reset HEAD filename.txt
Sie können auch verwenden
git add -p
Teile von Dateien hinzufügen.
|
Es gibt auch einen interaktiven Modus:
git add -i
Wählen Sie Option 3, um das Hinzufügen von Dateien aufzuheben. In meinem Fall möchte ich oft mehr als eine Datei hinzufügen, und im interaktiven Modus können Sie Zahlen wie diese verwenden, um Dateien hinzuzufügen. Dies dauert bis auf 4: 1, 2, 3 und 5
Um eine Sequenz auszuwählen, geben Sie einfach 1-5 ein, um alle von 1 bis 5 zu übernehmen.
Git-Staging-Dateien
|
git add myfile.txt # Hiermit wird Ihre Datei in die Liste der festzuschreibenden Dateien aufgenommen
Ganz im Gegenteil zu diesem Befehl ist,
git reset HEAD myfile.txt # Dies wird rückgängig gemachtes.
Sie befinden sich also im vorherigen Status. Angegeben wird wieder in der nicht verfolgten Liste (vorheriger Status).
Es wird Ihren Kopf mit der angegebenen Datei zurücksetzen. Wenn Ihr Kopf es nicht hat, setzt er es einfach zurück.
|
git reset filename.txt
Entfernt eine Datei mit dem Namen filename.txt aus dem aktuellen Index, dem Bereich "kurz vor dem Festschreiben", ohne dass etwas anderes geändert wird.
|
git reset filename.txt
Entfernt eine Datei mit dem Namen filename.txt aus dem aktuellen Index, dem Bereich "kurz vor dem Festschreiben", ohne dass etwas anderes geändert wird.
|
In Sourcetree können Sie dies einfach über die GUI tun.
Sie können überprüfen, mit welchem ​​Befehl Sourcetree eine Datei freigegeben hat.
Ich habe eine neue Datei erstellt und sie zu Git hinzugefügt. Dann habe ich es über die Sourcetree-Benutzeroberfläche freigegeben.
Das ist das Ergebnis:
Aufheben der Bereitstellung von Dateien [08/12/15 10:43]
git -c diff.mnemonicprefix = false -c core.quotepath = false -c credential.helper = Quellbaum zurücksetzen -q - Pfad / zu / Datei / Dateiname.java
Sourcetree verwendet Reset, um neue Dateien zu entfernen.
|
1
2
Nächster
Sehr aktive Frage. Verdiene 10 Reputationen, um diese Frage zu beantworten. Die Reputationsanforderung schützt diese Frage vor Spam und nicht beantworteten Aktivitäten.
Nicht die Antwort, die Sie suchen? Durchsuchen Sie andere Fragen mit dem Tag git version-control git-commit git-stage oder stellen Sie Ihre eigene Frage.